package com.shuijing.boot.transaction.service;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author 刘水镜
 * @blog https://liushuijinger.blog.csdn.net
 * @date 2021-05-04
 */
public interface TransactionService {

    /**
     * 清理资源的方法
     * 此方法可能用于清理事务中创建或修改的数据
     */
    void clean();

    /**
     * 测试没有事务管理时，调用两个Required传播行为的新增方法并抛出外部异常。
     * 此情况下新增操作不会回滚，因为方法未启用事务管理。
     */
    void noTransaction_required_required_externalException();

    /**
     * 测试没有事务管理时，调用两个Required传播行为的新增方法且第二个方法抛出异常。
     * 第一个新增操作不会回滚，因为没有事务上下文保障原子性。
     */
    void noTransaction_required_requiredException();

    /**
     * 测试事务方法中连续调用两个Required传播行为新增操作，并抛出外部异常。
     * 整个事务上下文将被标记回滚，两个新增操作都会回滚。
     */
    @Transactional
    void transaction_required_required_externalException();

    /**
     * 测试事务方法中调用两个Required传播行为新增操作，第二个方法主动抛出异常。
     * 整个事务上下文将被标记回滚，两个新增操作都会回滚。
     */
    @Transactional
    void transaction_required_requiredException();

    /**
     * 测试事务方法中捕获Required传播行为的异常。
     * 虽然捕获了异常，但由于事务已标记回滚，整个事务仍会回滚。
     */
    @Transactional
    void transaction_required_requiredException_try();

    /**
     * 测试事务方法中混合调用Required和RequiredNew传播行为并抛出外部异常。
     * 外部异常导致整个事务回滚，包含嵌套的独立新事务操作。
     */
    @Transactional
    void transaction_required_requiredNew_externalException();

    /**
     * 测试事务方法中连续调用Required和两个RequiredNew传播行为并抛出异常。
     * 所有操作将在同一事务上下文中执行，最终全部回滚。
     */
    @Transactional
    void transaction_required_requiredNew_requiredNewException();

    /**
     * 测试事务方法中捕获RequiredNew传播行为的异常。
     * 虽然捕获了嵌套事务的异常，但主事务仍会整体回滚。
     */
    @Transactional(propagation = Propagation.REQUIRED)
    void transaction_required_requiredNewException_try();

    /**
     * 测试事务方法中连续调用两个Nested传播行为并抛出外部异常。
     * 所有嵌套事务操作将在同一事务上下文中执行并全部回滚。
     */
    @Transactional
    void transaction_nested_nested_externalException();

    /**
     * 测试事务方法中连续调用两个Nested传播行为且第二个抛出异常。
     * 嵌套事务操作将触发整个事务回滚。
     */
    @Transactional
    void transaction_nested_nestedException();

    /**
     * 测试事务方法中混合调用Required和Nested传播行为并捕获异常。
     * 嵌套事务异常被捕获后，主事务仍会正常提交。
     */
    @Transactional
    void transaction_nested_nestedException_try();
}
